Technote 1182

NewGWorlds in VRAM and AGP Memory


CONTENTS

êVǵǢ NewGWorld ()

êVǵǢ NewGWorld () ÇÃégÇ¢ï˚

ÉCÉìÉvÉäÉÅÉìÉgÇÃé¿ç€

óvñÒ

DZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇ≈ÇÕÅAMac OS 9 ÇÃÉäÉäÅ[ÉXÇ…ÇΔLJǻǢ NewGWorld Ç…â¡Ç¶ÇÁÇÍÇΩïœçXDžǬǢǃê‡ñæÇµÇ‹Ç∑ÅB

Å@

êVǵǢ NewGWorld ÉãÅ[É`ÉìÇ≈ÇÕÅAÉIÉtÉXÉNÉäÅ[Éì GWorld Ç AGP ÉÅÉÇÉäÇ®ÇÊÇ— VRAM Ç…äÑÇËìñǃÇÈDZÇΔÇ™Ç≈Ç´ÇÈÇÊǧDžǻÇËNjǵÇΩÅBDZÇÍÇ…ÇÊÇËÅAÉIÉtÉXÉNÉäÅ[ÉìÉCÉÅÅ[ÉWÇÃäÑÇËìñǃï˚ñ@ÇåàíËÇ∑ÇÈè„Ç≈ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÉvÉçÉOÉâÉ}Ç…ÇÊÇËëÂÇ´Ç»é©óRìxÇ™ó^ǶÇÁÇÍÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅBǵǩǵÅAǪÇÃégÇ¢ï˚ÇåÎÇÈÇΔÅAèÛãµÇÕDZÇÍÇ‹Ç≈à»è„Ç…ï°éGǻLJÇÃÇ…Ç»ÇËÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉpÉtÉHÅ[É}ÉìÉXÇëÂïùÇ…í·â∫Ç≥ÇπÇÈå¥àˆÇ…ǻǡǃǵNjǧDZÇΔLJdžÇËÇ‹Ç∑ÅB

Å@

DZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇ≈ÇÕÅAêVǵǢÉZÉåÉNÉ^Çè–âÓǵÅAǪÇÍÇÁÇÃäÓñ{ìIÇ»égÇ¢ï˚Çê‡ñæÇµÇƒÇ©ÇÁÅADZÇÍÇÁÇÃÉZÉåÉNÉ^ÇÃégópÇ…ä÷òAǵǃî≠ê∂Ç∑ÇÈâ¬î\ê´ÇÃdžÇÈäÓñ{ìIÇ»ñ‚ëËÇÇ¢Ç≠ǬǩãÔëÃìIÇ…é¶ÇµÇ‹Ç∑ÅBÇ‹ÇΩÅAç≈å„Ç…ÅAä»íPÇ»ÉCÉìÉvÉäÉÅÉìÉgÇÃó·Çé¶ÇµÇ‹Ç∑ÅB


êVǵǢ NewGWorld ()

NewGWorld

NewGWorld ä÷êîÇégópÇ∑ÇÈÇΔÅAÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB


QDErr NewGWorld     (GWorldPtr   *   offscreenGWorld,
                              short           pixelDepth,
                              const Rect  *   boundsRect,
                              CTabHandle      cTable,    /* can be NULL */
                              GDHandle        aGDevice,  /* can be NULL */
                              GWorldFlags     flags)
         

offscreenGWorld

  • offscreenGWorld ÇÕÅADZÇÃÉãÅ[É`ÉìÇ…ÇÊǡǃçÏê¨Ç≥ÇÍÇÈÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇ÷ÇÃÉ|ÉCÉìÉ^Ç≈Ç∑ÅB

pixelDepth

  • pixelDepth ÇÕÅAÉIÉtÉXÉNÉäÅ[ÉìÉèÅ[ÉãÉhÇÃêFêîÇ≈ÅA1 ÉsÉNÉZÉãdžÇΩÇË 1ÅA2ÅA4ÅA8ÅA16ÅAÇ‹ÇΩÇÕ 32 ÉrÉbÉgÇ¢Ç∏ÇÍÇ©ÇÃílÇÇΔÇËÇ‹Ç∑ÅBNewGWorld ä÷êîÇÕÅAboundsRect ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩãÈå`ÇΔåç∑Ç∑ÇÈã´äEãÈå`ÇéùÇ¡ÇΩÇ∑Ç◊ǃÇÃÉXÉNÉäÅ[ÉìÇÃíÜÇ≈ç≈LJëΩÇ≠ÇÃêFêîÇä‹ÇfiÉXÉNÉäÅ[ÉìÇÃêFêîÇégópǵNjÇ∑ÅBDZÇÃÉpÉâÉÅÅ[É^Ç…É[ÉçÇéwíËÇ∑ÇÈÇΔÅANewGWorld ÇÕÉIÉtÉXÉNÉäÅ[ÉìÉèÅ[ÉãÉhÇ…ëŒÇ∑ÇÈêVǵǢ GDevice ÉåÉRÅ[ÉhÇçÏê¨Ç∑ÇÈë„ÇÌÇËÇ…ÅADZÇÃÉfÉoÉCÉXÇà GDevice ÉåÉRÅ[ÉhÇégópÇ∑ÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅBäÓñ{ìIÇ» QuickDraw ÇÃÇ›ÇÉTÉ|Å[ÉgÇ∑ÇÈÉRÉìÉsÉÖÅ[É^Ç≈ NewGWorld ÇégópÇ∑ÇÈèÍçáÇÕÅADZÇÃÉpÉâÉÅÅ[É^Ç…É[ÉçÇ‹ÇΩÇÕ 1 ÇÃÇ›ÇéwíËǵNjÇ∑ÅB

boundsRect

  • boundsRect ÇÕÅAÉIÉtÉXÉNÉäÅ[ÉìÇÃÉsÉNÉZÉãÉ}ÉbÉvÇ…ëŒÇ∑ÇÈã´äEãÈå`Ç®ÇÊÇ—É|Å[ÉgãÈå`Ç≈Ç∑ÅBNewGWorld Ç™ GDevice ÉåÉRÅ[ÉhÇçÏê¨Ç∑ÇÈèÍçáÅADZÇÍÇÕ GDevice ÉåÉRÅ[ÉhÇ…ëŒÇ∑ÇÈã´äEãÈå`ÇΔÇ»ÇËÇ‹Ç∑ÅBpixelDepth ÉpÉâÉÅÅ[É^Ç…É[ÉçÇéwíËÇ∑ÇÈÇΔÅANewGWorld ÇÕã´äEÇÉOÉçÅ[ÉoÉãç¿ïWÇ≈âéflǵÅAǪÇÍÇégǡǃÅAÇ«ÇÃÉXÉNÉäÅ[ÉìÇ™ãÈå`ÇΔåç∑Ç∑ÇÈÇ©ÇîªífǵNjÇ∑ (DZÇÃå„ÅANewGWorld ÇÕÅADZÇÃãÈå`ÇΔåç∑Ç∑ÇÈã´äEãÈå`ÇéùÇ¡ÇΩÇ∑Ç◊ǃÇÃÉXÉNÉäÅ[ÉìÇÃíÜÇ≈ç≈LJëΩÇ≠ÇÃêFêîÇä‹ÇfiÉXÉNÉäÅ[ÉìÇÃêFêîÅAÉJÉâÅ[ÉeÅ[ÉuÉãÅAÇ®ÇÊÇ— GDevice ÉåÉRÅ[ÉhÇégópǵNjÇ∑)ÅBí èÌÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕDZÇÃÉpÉâÉÅÅ[É^Ç…ÅADZÇÃÉIÉtÉXÉNÉäÅ[ÉìÉèÅ[ÉãÉhÇ©ÇÁÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÉRÉsÅ[Ç∑ÇÈÉIÉìÉXÉNÉäÅ[ÉìÉEÉCÉìÉhÉEÇ…ëŒâûÇ∑ÇÈÉ|Å[ÉgãÈå`ÇéwíËǵNjÇ∑ÅB

cTable

  • cTable ÇÕ ColorTable ÉåÉRÅ[ÉhÇ÷ÇÃÉnÉìÉhÉãÇ≈Ç∑ÅBDZÇÃÉpÉâÉÅÅ[É^Ç… NULL ÇìnÇ∑ÇΔÅANewGWorld ÇÕ pixelDepth ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩêFêîÇ…ëŒâûÇ∑ÇÈÉfÉtÉHÉãÉgÇÃÉJÉâÅ[ÉeÅ[ÉuÉãÇégópǵNjÇ∑ÅBpixelDepth ÉpÉâÉÅÅ[É^Ç… 0 Çê›íËÇ∑ÇÈÇΔÅANewGWorld ÇÕ cTable ÉpÉâÉÅÅ[É^ÇÃê›íËÇñ≥éãǵÅAboundsRect ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩãÈå`ÇΔåç∑Ç∑ÇÈã´äEãÈå`ÇéùÇ¡ÇΩÇ∑Ç◊ǃÇÃÉOÉâÉtÉBÉbÉNÉXÉfÉoÉCÉXÇÃíÜÇ≈ç≈LJëΩÇ≠ÇÃêFêîÇä‹ÇfiÉOÉâÉtÉBÉbÉNÉXÉfÉoÉCÉXÇÃÉJÉâÅ[ÉeÅ[ÉuÉãÇÉRÉsÅ[ǵǃégópǵNjÇ∑ÅBäÓñ{ìIÇ» QuickDraw ÇÃÇ›ÇÉTÉ|Å[ÉgÇ∑ÇÈÉRÉìÉsÉÖÅ[É^Ç≈ NewGWorld ÇégópÇ∑ÇÈèÍçáÇÕÅADZÇÃÉpÉâÉÅÅ[É^Ç… NULL ÇÃÇ›ÇéwíËǵNjÇ∑ÅB

aGDevice

  • aGDevice ÇÕÅA2 ǬÇÃÉPÅ[ÉXÇÃÇ›Ç≈égópÇ≥ÇÍÇÈ GDevice ÉåÉRÅ[ÉhÇ÷ÇÃÉnÉìÉhÉãÇ≈Ç∑ÅBÇ‹Ç∏ëÊ 1 Ç…ÅAflags ÉpÉâÉÅÅ[É^Ç≈ noNewDevice ÉtÉâÉOÇÉZÉbÉgǵÇΩèÍçáÅANewGWorld ÇÕêVǵǢÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhDžDZÇà GDevice ÉåÉRÅ[ÉhÇÉAÉ^ÉbÉ`ǵNjÇ∑ÅBëÊ 2 Ç…ÅAflags ÉpÉâÉÅÅ[É^Ç≈ useDistantHdwrMem Ç‹ÇΩÇÕ useLocalHdwrMem ÉtÉâÉOÇÉZÉbÉgǵÇΩèÍçáÅANewGWorld ÇÕDZÇà GDevice Çà VRAM Ç‹ÇΩÇÕ AGP ÉÅÉÇÉäÇégǡǃ GWorld Çäiî[ǵNjÇ∑ÅBpixelDepth ÉpÉâÉÅÅ[É^Ç…É[ÉçÇê›íËÇ∑ÇÈÇ©ÅAnoNewDeviceÅAuseDistantHdwrMemÅAÇ‹ÇΩÇÕ useLocalHdwrMem ÉtÉâÉOÇÉZÉbÉgǵǻǩǡÇΩèÍçáÅANewGWorld ÇÕ aGDevice ÉpÉâÉÅÅ[É^Çñ≥éãÇ∑ÇÈÇΩÇflÅADZÇÃÉpÉâÉÅÅ[É^Ç…ÇÕ NULL Çê›íËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBpixelDepth ÉpÉâÉÅÅ[É^Ç…É[ÉçÇê›íËÇ∑ÇÈÇΔÅANewGWorld ÇÕÅAboundsRect ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩãÈå`ÇΔåç∑Ç∑ÇÈã´äEãÈå`ÇéùÇ¡ÇΩÇ∑Ç◊ǃÇÃÉOÉâÉtÉBÉbÉNÉXÉfÉoÉCÉXÇÃíÜÇ≈ç≈LJëΩÇ≠ÇÃêFêîÇä‹ÇfiÉOÉâÉtÉBÉbÉNÉXÉfÉoÉCÉXÇà GDevice ÉåÉRÅ[ÉhÇégópǵNjÇ∑ÅBÉRÉìÉsÉÖÅ[É^Ç™äÓñ{ìIÇ» QuickDraw ÇÃÇ›ÇÉTÉ|Å[ÉgǵǃǢÇÈèÍçáÇÕÅADZÇÃÉpÉâÉÅÅ[É^Ç… NULL ÇìnǵǃÇ≠ÇæÇ≥Ç¢ÅBàÍî Ç…ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇ…ëŒÇ∑ÇÈ GDevice ÉåÉRÅ[ÉhÇçÏê¨Ç∑ÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅBuseDistantHdwrMem Ç‹ÇΩÇÕ useLocalHdwrMem ÉtÉâÉOÇÉZÉbÉgǵÇΩèÍçáÇÕÅAèÌÇ… GDevice ÇéwíËǵǃÇ≠ÇæÇ≥Ç¢ÅBGDeviceÇéwíËǵǻǢÇΔÅAGWorld Ç…ä÷òAÇ∑ÇÈìÆçÏÇΔÉfÉoÉCÉXÇ™ïsíËDžǻǡǃǵNjǢNjÇ∑ÅB

flags

  • flags ÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égópâ¬î\Ç»ÉIÉvÉVÉáÉìÇãLèqǵNjÇ∑ÅBpixPurgeÅAnoNewDeviceÅAuseTempMemÅAkeepLocalÅAuseDistantHdwrMemÅAÇ®ÇÊÇ— useLocalHdwrMem ÇÃäeÉtÉâÉOÇÕÅAÇŸÇ⁄é©óRÇ…ëgÇ›çáÇÌÇπǃégópÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÍÇÁÇÃÉtÉâÉOÇÃÇ¢Ç∏ÇÍLJégópǵÇΩÇ≠ǻǢèÍçáÇÕÅADZÇÃÉpÉâÉÅÅ[É^Ç… 0 ÇìnǵNjÇ∑ÅBDZÇÃÇΔÇ´ NewGWorld ÇÕÉfÉtÉHÉãÉgÇÃìÆçÏÇçsǢNjÇ∑ÅBǬNjÇËÅAÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃÉxÅ[ÉXÉAÉhÉåÉXÇ™ÉpÅ[ÉWÇ≥ÇÍǻǢèÍèäÇ…ÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÇçÏê¨ÇµÅAä˘ë∂Çà GDevice ÉåÉRÅ[ÉhÇégópÇ∑ÇÈÇ© (pixelDepth ÉpÉâÉÅÅ[É^Ç… 0 ÇìnǵÇΩèÍçá)ÅAêVǵǢ GDevice ÉåÉRÅ[ÉhÇçÏê¨ÇµÇƒÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÉqÅ[Évì‡ÇÃÉÅÉÇÉäÇégópǵNjÇ∑ÅBÇ‹ÇΩÅAÉOÉâÉtÉBÉbÉNÉXÉAÉNÉZÉâÉåÅ[É^Ç™ÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÉLÉÉÉbÉVÉÖÇ…äiî[Ç∑ÇÈDZÇΔÇ™ãñâ¬Ç≥ÇÍÇ‹Ç∑ÅBǻǮÅAkeepLocal ÇÕ useDistantHdwrMem Ç‹ÇΩÇÕ useLocalHdwrMem ÇΔÇΔLJDžégópǵǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBåãâ Ç™ïsíËDžǻǡǃǵNjǢNjÇ∑ÅBéüÇ…ÅAégópâ¬î\Ç»ÉtÉâÉOÇÃê‡ñæÇé¶ÇµÇ‹Ç∑ÅB

enum 
{
     pixPurge           = 1L << pixPurgeBit,
     noNewDevice        = 1L << noNewDeviceBit,
     useTempMem         = 1L << useTempMemBit,
     keepLocal          = 1L << keepLocalBit,
     useDistantHdwrMem  = 1L << useDistantHdwrMemBit,
     useLocalHdwrMem    = 1L << useLocalHdwrMemBit,
};
typedef unsigned longGWorldFlags;
         

pixPurge

  • ÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃÉxÅ[ÉXÉAÉhÉåÉXÇÉpÅ[ÉWâ¬î\DžǵNjÇ∑ÅB

noNewDevice

  • ÉIÉtÉXÉNÉäÅ[Éì GDevice ÉåÉRÅ[ÉhÇÃçÏê¨Çí‚é~ǵNjÇ∑ÅB

useTempMem

  • ÉeÉìÉ|ÉâÉäÉÅÉÇÉäì‡Ç…ÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃÉxÅ[ÉXÉAÉhÉåÉXÇçÏê¨ÇµÇ‹Ç∑ÅB

keepLocal

  • ÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÉÅÉCÉìÉÅÉÇÉäì‡Ç…ï€éùǵNjÇ∑Ç™ÅAÉOÉâÉtÉBÉbÉNÉXÉAÉNÉZÉâÉåÅ[É^ÉJÅ[ÉhÇÃÉLÉÉÉbÉVÉÖÇ…äiî[Ç≈Ç´Ç»Ç≠Ç»ÇËÇ‹Ç∑ÅB

useDistantHdwrMem

  • VRAM ì‡Ç≈ÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃçÏê¨ÇééǛNjÇ∑ÅB

useLocalHdwrMem

  • AGP ÉÅÉÇÉäì‡Ç≈ÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃçÏê¨ÇééǛNjÇ∑ÅB

âê‡

NewGWorld ä÷êîÇÕÅApixelDepth ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩêFêîÅAboundsRect ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩã´äEãÈå`ÅAcTable ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩÉJÉâÅ[ÉeÅ[ÉuÉãÅAǪÇÍÇ… flags ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩÉIÉvÉVÉáÉìÇégǡǃÅAÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇçÏê¨ÇµÇ‹Ç∑ÅBNewGWorld ä÷êîÇÕÅAoffscreenGWorld ÉpÉâÉÅÅ[É^Ç…êVǵǢÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇ÷ÇÃÉ|ÉCÉìÉ^Çï‘ǵNjÇ∑ÅBDZÇÃÉ|ÉCÉìÉ^ÇÕÅADZÇÃèÕÇ≈ê‡ñæÇ∑ÇÈëºÇÃÉãÅ[É`ÉìÇÃíÜÇ≈DZÇÃêVǵǢÉIÉtÉXÉNÉäÅ[ÉìÉèÅ[ÉãÉhÇéQèΔÇ∑ÇÈÇΔÇ´Ç…égópǵNjÇ∑ÅB

í èÌÅApixelDepth ÉpÉâÉÅÅ[É^Ç…ÇÕ 0 ÇìnǵÅAboundsRect ÉpÉâÉÅÅ[É^Ç…ÇÕÉEÉCÉìÉhÉEÇÃÉ|Å[ÉgãÈå`ÇìnǵÅAcTable Ç®ÇÊÇ— aGDevice ÉpÉâÉÅÅ[É^Ç…ÇÕ NULL ÇìnǵNjÇ∑ÅBÇ‹ÇΩÅAPascal ÇÃÉRÅ[ÉhÇÃèÍçáÇÕ flags ÉpÉâÉÅÅ[É^Ç…ãÛèWçá ([ ]) ÇìnǵÅAC ÇÃÉRÅ[ÉhÇÃèÍçáÇÕ 0 ÇìnǵNjÇ∑ÅBDZÇÍÇ…ÇÊÇËÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÕ NewGWorld ÇÃÉfÉtÉHÉãÉgÇÃìÆçÏÇ™íÒãüÇ≥ÇÍÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕäÓñ{ìIÇ» QuickDraw Çé¿çsÇ∑ÇÈÉRÉìÉsÉÖÅ[É^ÇÉTÉ|Å[ÉgÇ∑ÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅBÇ‹ÇΩÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhì‡ÇÃÉCÉÅÅ[ÉWÇÉIÉìÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉ|Å[ÉgÇ…ÉRÉsÅ[Ç∑ÇÈÇΔÇ´ÅAQuickDraw ÇÕ CopyBitsÅACopyMaskÅAÇ®ÇÊÇ— CopyDeepMask ÉvÉçÉVÅ[ÉWÉÉÇç≈ìKâªÇ≈Ç´ÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅB

NewGWorld ä÷êîÇÕÅAÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉ|Å[ÉgÇΔǪÇÃÉsÉNÉZÉãÉ}ÉbÉvÇ…égópÇ∑ÇÈÉÅÉÇÉäÇäÑÇËìñǃNjÇ∑ÅBäÓñ{ìIÇ» QuickDraw ÇÃÇ›ÇÉTÉ|Å[ÉgÇ∑ÇÈÉRÉìÉsÉÖÅ[É^Ç≈ÇÕÅANewGWorld ÇÕÅADZÇÃèÕÇ≈ê‡ñæÇ∑ÇÈëºÇÃèdóvÇ»ÉãÅ[É`ÉìÇégǡǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ëÄçÏÇ≈Ç´ÇÈ 1 ÉrÉbÉgÇÃÉsÉNÉZÉãÉ}ÉbÉvÇçÏê¨ÇµÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅADZÇà 1 ÉrÉbÉgÇÃÉsÉNÉZÉãÉ}ÉbÉvÇäÓñ{ìIÇ»ÉOÉâÉtÉBÉbÉNÉXÉ|Å[ÉgÇÃíÜÇ…ÉRÉsÅ[Ç≈Ç´Ç‹Ç∑ÅB

pixelDepth ÉpÉâÉÅÅ[É^Ç…É[ÉçÇéwíËǵǻǢǩǨÇËÅAÇ‹ÇΩÇÕ flags ÉpÉâÉÅÅ[É^Ç… noNewDevice ÉtÉâÉOÇìnǵǃÅAaGDevice ÉpÉâÉÅÅ[É^Ç… GDevice ÉåÉRÅ[ÉhÇìnÇ≥ǻǢǩǨÇËÅANewGWorld ÇÕêVǵǢÉIÉtÉXÉNÉäÅ[Éì GDevice ÉåÉRÅ[ÉhLJäÑÇËìñǃNjÇ∑ÅB

ÉCÉÅÅ[ÉWÇçÏê¨Ç∑ÇÈÇΔÇ´ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕ NewGWorld ä÷êîÇégǡǃÅAêFêîǻǫÇÃÉCÉÅÅ[ÉWÇÃì¡ê´Çç≈ìKâªÇµÇΩÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇçÏê¨ÇµÇ‹Ç∑ÅBÉCÉÅÅ[ÉWçÏê¨å„ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÇ≥ÇÁÇ… CopyBitsÅACopyMaskÅAÇ‹ÇΩÇÕ CopyDeepMask ÉvÉçÉVÅ[ÉWÉÉÇégǡǃÅAǪÇÃÉCÉÅÅ[ÉWÇÉIÉìÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉ|Å[ÉgÇ…ÉRÉsÅ[ǵNjÇ∑ÅBColor QuickDraw ÇÕÅAÉXÉNÉäÅ[ÉìÇ≈égópâ¬î\Ç»ç≈ëÂÇÃêFêîÇégǡǃÅAé©ìÆìIÇ…ÉCÉÅÅ[ÉWÇÃÉåÉìÉ_ÉäÉìÉOÇçsǢNjÇ∑ÅBDZÇÃÇÊǧDžÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉ|Å[Égì‡Ç≈ÉCÉÅÅ[ÉWÇçÏê¨ÇµÇƒÅAǪÇÍÇÉXÉNÉäÅ[ÉìÇ…ÉRÉsÅ[Ç∑ÇÈDZÇΔÇ≈ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ï°éGÇ»ÉCÉÅÅ[ÉWÇÉIÉìÉXÉNÉäÅ[ÉìÇ≈íºê⁄ç\ízÇ∑ÇÈèÍçáÇ…î≠ê∂Ç∑ÇÈâ¬î\ê´ÇÃdžÇÈéãäoìIÇ»Ç¨Ç±ÇøÇ»Ç≥Çó}ǶÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

NewGWorld ä÷êîÇÕÅAOpenCPort ä÷êîÇåƒÇ—èoǵǃÅAÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉ|Å[ÉgÇèâä˙âªÇµÇ‹Ç∑ÅBNewGWorld ä÷êîÇÕÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉ|Å[ÉgÇÃâ¬éãóÃàÊÇ…ÅAǪÇÃã´äEãÈå`ÇΔàÍívÇ∑ÇÈãÈå`óÃàÊÇê›íËǵNjÇ∑ÅBÉXÉNÉäÅ[ÉìÇà GDevice ÉåÉRÅ[ÉhÇÃÇ¢Ç∏ÇÍǩǙÉIÉtÉXÉNÉäÅ[ÉìÉèÅ[ÉãÉhÇà GDevice ÉåÉRÅ[ÉhÇΔìØÇ∂ÉJÉâÅ[ÉeÅ[ÉuÉãÇã§óLǵǃǢǻǢǩǨÇËÅANewGWorld ä÷êîÇÕ Color Manager ÉvÉçÉVÅ[ÉWÉÉÇà MakeITable ÇégǡǃîΩì]ÉeÅ[ÉuÉãÇê∂ê¨ÇµÇ‹Ç∑ÅBÇ‹ÇΩÅAÉXÉNÉäÅ[ÉìÇΔÉIÉtÉXÉNÉäÅ[ÉìÇ≈ÉJÉâÅ[ÉeÅ[ÉuÉãÇ™ã§óLÇ≥ÇÍǃǢÇÈèÍçáÇÕÅAǪÇà GDevice ÉåÉRÅ[ÉhÇÃîΩì]ÉeÅ[ÉuÉãÇ™égópÇ≥ÇÍÇ‹Ç∑ÅB

ÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃÉAÉhÉåÉXÇÕÅAÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇà PixMap ÉåÉRÅ[ÉhÇ©ÇÁÇÕíºê⁄ìIÇ…ÉAÉNÉZÉXÇ≈Ç´Ç‹ÇπÇÒÅBǵǩǵÅAGetPixBaseAddr ä÷êî (ÅwInside MacintoshÅxÇà 6-38 ÉyÅ[ÉWÇ≈ê‡ñæÇ≥ÇÍǃǢNjÇ∑) ÇégǡǃÅAÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃêÊì™Ç÷ÇÃÉ|ÉCÉìÉ^ÇéÊìæÇ∑ÇÈDZÇΔÇÕâ¬î\Ç≈Ç∑ÅB

ÉÅÉÇÉäÇÃégópèÛãµÇå©êœÇ‡ÇÈÇΩÇflÅAéüÇÃéÆÇégǡǃÅAÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃÉTÉCÉYÇåvéZÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB


rowBytes * (boundsRect.bottom - boundsRect.top)

flags ÉpÉâÉÅÅ[É^Ç≈ÇÕÅAGWorldFlags ÉfÅ[É^å^Ç…ÇÊǡǃíËã`Ç≥ÇÍǃǢÇÈÇ¢Ç≠ǬǩÇÃÉIÉvÉVÉáÉìÇéwíËÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÍÇÁÇÃÉIÉvÉVÉáÉìÇÃÇ¢Ç∏ÇÍLJégópǵÇΩÇ≠ǻǢèÍçáÇÕÅAǪÇÃÉIÉvÉVÉáÉìÇ…É[ÉçÇìnǵNjÇ∑ÅB

pixPurge ÉtÉâÉOÇéwíËÇ∑ÇÈÇΔÅANewGWorld ÇÕÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÉpÅ[ÉWâ¬î\Ç»ÉÅÉÇÉäÉuÉçÉbÉNÇ…äiî[ǵNjÇ∑ÅBDZÇÃèÍçáÇÕÅAÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇΔÇÃä‘Ç≈ï`âÊÇÃÇ‚ÇËéÊÇËÇäJénÇ∑ÇÈëOÇ…ÅALockPixels ä÷êî (ÅwInside Macintosh: Imaging With QuickDrawÅxÇ≈ê‡ñæÇ≥ÇÍǃǢNjÇ∑) ÇåƒÇ—èoǵǃÅADZÇÃä÷êîÇ™ TRUE Çï‘Ç∑DZÇΔÇämîFǵǃÇ≠ÇæÇ≥Ç¢ÅB LockPixels Ç™ FALSE Çï‘Ç∑èÍçáÅAÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃÉÅÉÇÉäÇÕÇ∑Ç≈Ç…ÉpÅ[ÉWÇ≥ÇÍǃǢNjÇ∑ÅBDZÇÃÇΩÇflÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAUpdateGWorld ÇåƒÇ—èoǵǃÉÅÉÇÉäÇÃçƒäÑÇËìñǃÇçsÇ¢ÅAÉsÉNÉZÉãÉCÉÅÅ[ÉWÇçƒç\ízÇ∑ÇÈÇ©ÅAÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhì‡Ç≈ÉCÉÅÅ[ÉWÇèÄîıÇ∑ÇÈë„ÇÌÇËÇ…ÉEÉCÉìÉhÉEì‡Ç≈íºê⁄ï`âÊÇçsǧïKóvǙdžÇËÇ‹Ç∑ÅBǻǮÅAÉÅÉÇÉäÇÃçƒäÑÇËìñǃÇçsÇÌǻǢÇ≈ÉsÉNÉZÉãÉCÉÅÅ[ÉWÇçƒç\ízǵǃÅAÉpÅ[ÉWÇ≥ÇÍǃǢÇÈÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇ…ï`âÊÇçsÇ¡ÇΩÇËÅAÉpÅ[ÉWÇ≥ÇÍǃǢÇÈÉsÉNÉZÉãÉCÉÅÅ[ÉWÇ©ÇÁÉfÅ[É^ÇÉRÉsÅ[Ç∑ÇÈDZÇΔÇÕê‚ëŒÇ…îÇØÇƒÇ≠ÇæÇ≥Ç¢ÅBnoNewDevice ÉtÉâÉOÇéwíËÇ∑ÇÈÇΔÅANewGWorld ÇÕêVǵǢÉIÉtÉXÉNÉäÅ[Éì GDevice ÉåÉRÅ[ÉhÇçÏê¨ÇµÇ»Ç≠Ç»ÇËÇ‹Ç∑ÅBǪÇÃë„ÇÌÇËÇ… aGDevice ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩ GDevice ÉåÉRÅ[Éh (Ç®ÇÊǗǪÇÍÇ…ä÷òAÇ∑ÇÈêFêîÇΔÉJÉâÅ[ÉeÅ[ÉuÉã) ÇégǡǃÅAÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇ™çÏê¨Ç≥ÇÍÇ‹Ç∑ (pixelDepth ÉpÉâÉÅÅ[É^Ç… 0 Çê›íËÇ∑ÇÈÇΔÅAÇΩÇΔǶ noNewDevice ÉtÉâÉOÇéwíËǵǃǢǃLJÅANewGWorld ÇÕ boundsRect ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩãÈå`ÇΔåç∑Ç∑ÇÈã´äEãÈå`ÇéùÇ¡ÇΩÇ∑Ç◊ǃÇÃÉXÉNÉäÅ[ÉìÇÃíÜÇ≈ç≈LJëΩÇ≠ÇÃêFêîÇä‹ÇfiÉXÉNÉäÅ[ÉìÇà GDevice ÉåÉRÅ[ÉhÇégópǵNjÇ∑)ÅBNewGWorld ä÷êîÇÕÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇà GDevice ÉåÉRÅ[ÉhÇ÷ÇÃéQèΔÇï€éùǵÅASetGWorld ÉvÉçÉVÅ[ÉWÉÉ(ÅwInside Macintosh: Imaging With QuickDrawÅxÇ≈ê‡ñæÇ≥ÇÍǃǢNjÇ∑) ÇÕDZÇÃÉåÉRÅ[ÉhÇégǡǃåªç›ÇÃÉOÉâÉtÉBÉbÉNÉXÉfÉoÉCÉXÇê›íËǵNjÇ∑ÅBuseTempMem ÉtÉâÉOÇÉZÉbÉgÇ∑ÇÈÇΔÅANewGWorld ÇÕÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃÉxÅ[ÉXÉAÉhÉåÉXÇÉeÉìÉ|ÉâÉäÉÅÉÇÉäì‡Ç…çÏê¨ÇµÇ‹Ç∑ÅBÉeÉìÉ|ÉâÉäÉÅÉÇÉäÇÕébíËìIÇ»ñ⁄ìIÇ…ÇÃÇ›égópǵÅAAllowPurgePixels ÉvÉçÉVÅ[ÉWÉÉ (ÅwInside Macintosh: Imaging With QuickDrawÅxÇ≈ê‡ñæÇ≥ÇÍǃǢNjÇ∑)ÇΔÇÃÇ›ëgÇ›çáÇÌÇπǃégópÇ∑ÇÈïKóvǙdžÇÈÇΩÇflÅAí èÌÅADZÇÃÉtÉâÉOÇégópÇ∑ÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅBkeepLocal ÉtÉâÉOÇéwíËÇ∑ÇÈÇΔÅAÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÕ Macintosh ÇÃÉÅÉCÉìÉÅÉÇÉäÇ…ï€éùÇ≥ÇÍÅAÉOÉâÉtÉBÉbÉNÉXÉAÉNÉZÉâÉåÅ[É^ÉJÅ[ÉhÇÃÉLÉÉÉbÉVÉÖÇ…ÇÕäiî[Ç≥ÇÍÇ»Ç≠Ç»ÇËÇ‹Ç∑ÅBëgÇ›çûÇ‹ÇÍǃǢÇÈÉOÉâÉtÉBÉbÉNÉXÉAÉNÉZÉâÉåÅ[É^ÉJÅ[ÉhÇ…ÇÊǡǃLJÇΩÇÁÇ≥ÇÍÇÈóòì_Çí†è¡ÇµÇ…ǵǃǵNjǧDZÇΔLJdžÇÈÇÃÇ≈ÅADZÇÃÉtÉâÉOÇégópÇ∑ÇÈÇΔÇ´Ç…ÇÕè\ï™Ç»íçà”Ç™ïKóvÇ≈Ç∑ÅBuseDistantHdwrMem Ç‹ÇΩÇÕ useLocalHdwrMem ÇéwíËÇ∑ÇÈÇΔÅANewGWorld ÇÕ VRAM Ç‹ÇΩÇÕ AGP ÉÅÉÇÉäì‡Ç…ÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇäÑÇËìñǃÇÊǧÇΔǵNjÇ∑ÅBóºï˚ÇÃÉtÉâÉOÇ™éwíËÇ≥ÇÍǃǢÇÈÇΔÅANewGWorld ÇÕÇ‹Ç∏ AGP ÉÅÉÇÉäì‡Ç≈äÑÇËìñǃÇééÇ›ÅADZÇÍÇ…é∏îsÇ∑ÇÈÇΔÅAVRAM ì‡Ç≈äÑÇËìñǃÇééǛNjÇ∑ÅBuseDistantHdwrMemÅAuseLocalHdwrMemÅAÇ‹ÇΩÇÕDZÇÃóºï˚ÇégópǵǃǢǃÅANewGWorld Ç™óvãÅÇ≥ÇÍÇΩÉÅÉÇÉäóÃàÊì‡Ç…ÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇäÑÇËìñǃÇÈDZÇΔÇ™Ç≈ǴǻǢÇΔÅANewGWorld ÇÕàŸèÌèIóπǵÅAmemFullErr ÉGÉâÅ[ÉRÅ[ÉhÇï‘ǵNjÇ∑ÅB

é¿çsåãâ ÇΔǵǃÅANewGWorld ÇÕå„èqÇ∑ÇÈ 4 ǬÇÃåãâ ÉRÅ[ÉhÇÃÇ§ÇøÇÃÇ¢Ç∏ÇÍÇ©Çï‘ǵNjÇ∑ÅBNewGWorld ÇÃåƒÇ—èoǵǙê≥èÌÇ…èIóπÇ∑ÇÈÇΔÅAèÌÇ… noErr Ç™ï‘Ç≥ÇÍÇ‹Ç∑ÅBǪÇÃëºÇÃåãâ ÉRÅ[ÉhÇ™ï‘Ç≥ÇÍÇΩÇΔÇ´ÇÕÅANewGWorld Ç™óvãÅÇ≥ÇÍÇΩÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃäÑÇËìñǃDžé∏îsǵÇΩÇΔå©Ç»ÇµÇƒÇ≠ÇæÇ≥Ç¢ÅB

ì¡Ç…íçà”ÇóvÇ∑ÇÈñ‚ëË

cTable ÉpÉâÉÅÅ[É^Ç… ColorTable ÉåÉRÅ[ÉhÇ÷ÇÃÉnÉìÉhÉãÇéwíËÇ∑ÇÈÇΔÅANewGWorld ÇÕǪÇÃÉåÉRÅ[ÉhÇÃÉRÉsÅ[ÇçÏê¨ÇµÅAǪÇÃÉnÉìÉhÉãÇÉIÉtÉZÉbÉgÉXÉNÉäÅ[ÉìÇà PixMap ÉåÉRÅ[ÉhÇ…äiî[ǵNjÇ∑ÅBcTable ÉpÉâÉÅÅ[É^Ç≈éwíËǵÇΩ ColorTable ÉåÉRÅ[ÉhÇ™ÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉ|Å[ÉgÇÃêFêîÇ…ëŒÇµÇƒóLå¯Ç≈džÇÈǩǫǧǩÇämîFÇ∑ÇÈDZÇΔÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃê”îCÇ≈Ç∑ÅB

NewGWorld ÇégópÇ∑ÇÈÇΔÇ´Ç…ÅAêFêîÅAÉJÉâÅ[ÉeÅ[ÉuÉãÅAÇ‹ÇΩÇÕ GDevice ÉåÉRÅ[ÉhÇéwíËǵÅADZÇÍÇ™ÉIÉtÉXÉNÉäÅ[ÉìÉCÉÅÅ[ÉWÇÃÉRÉsÅ[êÊÇΔÇ»ÇÈÉEÉCÉìÉhÉEÇ≈égópÇ≥ÇÍǃǢÇÈêFêîÅAÉJÉâÅ[ÉeÅ[ÉuÉãÅAÇ‹ÇΩÇÕ GDevice ÉåÉRÅ[ÉhÇΔàŸÇ»Ç¡ÇƒÇ¢ÇÈèÍçáÇÕÅACopyBitsÅACopyMaskÅAÇ®ÇÊÇ— CopyDeepMask ÉvÉçÉVÅ[ÉWÉÉÇÕǪÇÃé¿çsDžǩǻÇËÇÃéûä‘ÇóvÇ∑ÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅBDZÇÍÇ…ÇÊÇËÅAAGP ÉÅÉÇÉäÇ‹ÇΩÇÕ VRAM ì‡Ç…äÑÇËìñǃÇÁÇÍǃǢÇÈÉoÉbÉtÉ@Ç™ÉnÅ[ÉhÉEÉFÉAÉuÉäÉbÉeÉBÉìÉOÇóòópÇ≈Ç´Ç»Ç≠Ç»ÇËÅAåãâ ìIÇ…ÉRÉsÅ[ÇÃÉpÉtÉHÅ[É}ÉìÉXÇ™ã…í[Ç…í·â∫ǵǃǵNjǧâ¬î\ê´Ç™Ç†ÇËÇ‹Ç∑ÅB

VRAM ì‡Ç…äÑÇËìñǃÇÁÇÍÇΩ GWorld Ç…ä÷ǵǃÅAì¡Ç…íçà”Ç∑Ç◊Ç´ 2 ǬÇÃèdóvÇ»ñ‚ëËǙdžÇËÇ‹Ç∑ÅBÇ‹Ç∏ëÊ 1 Ç…ÅAVRAM ì‡Ç≈ÉÅÉÇÉäÇ™äÑÇËìñǃÇÁÇÍÇÈÇΩÇ—Ç…ÅAGetPixBaseAddr ÇâÓǵǃéÊìæÇ≥ÇÍÇΩÉxÅ[ÉXÉAÉhÉåÉXÇ‚ PixMap ç\ë¢ëÃÇ©ÇÁíºê⁄ì«Ç›çûÇ‹ÇÍÇΩÉxÅ[ÉXÉAÉhÉåÉXÇ™ñ≥å¯Ç…ǻǡǃǵNjǧDZÇΔǙdžÇËÇ‹Ç∑ÅBDZÇÃñ‚ëËÇÕÅANewGWorld ÇÃåƒÇ—èoǵÇÃÇÊǧǻñæé¶ìIäÑÇËìñǃDžÇÊǡǃLJî≠ê∂ǵNjÇ∑Ç™ÅAOpenGL ÇÃì‡ïîÉeÉNÉXÉ`ÉÉäÑÇËìñǃDžä÷òAÇ∑ÇÈåƒÇ—èoǵÇÃÇÊǧǻà√ñŸìIäÑÇËìñǃDžÇÊǡǃLJî≠ê∂ǵNjÇ∑ÅBäiî[Ç≥ÇÍǃǢÇÈÉsÉNÉZÉãÉCÉÅÅ[ÉWǪÇÃLJÇÃÇÕèÌÇ…óLå¯Ç≈Ç∑Ç™ÅAǪÇÍÇÕÇ∑Ç≈Ç… VRAM ì‡Ç…à⁄ìÆÇ≥ÇÍǃǢÇÈÇΩÇflÅAäiî[Ç≥ÇÍǃǢÇÈÉxÅ[ÉXÉAÉhÉåÉXÇÃÉåÉìÉ_ÉäÉìÉOÇÕñ≥å¯Ç…ǻǡǃǵNjǢNjÇ∑ÅBïKóvà»è„Ç…í∑Ç¢éûä‘ÉCÉÅÅ[ÉWÇÃÉxÅ[ÉXÉAÉhÉåÉXÇäiî[ǵǻǢÇÊǧDžǵǃÇ≠ÇæÇ≥Ç¢ÅBì¡Ç…ÅANewGWorld Ç‚ ÉeÉNÉXÉ`ÉÉçÏê¨ÉãÅ[É`ÉìÇÃåƒÇ—èoǵÇÇÕÇ≥ÇÒÇ≈ÉxÅ[ÉXÉAÉhÉåÉXÇäiî[ǵë±ÇØÇÈDZÇΔÇÕê‚ëŒÇ…îÇØÇƒÇ≠ÇæÇ≥Ç¢ÅB

ëÊ 2 Ç…ÅAVRAM ì‡Ç…äÑÇËìñǃÇÁÇÍÇΩÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÕÅAÉfÉBÉXÉvÉåÉCÉhÉâÉCÉoÇ…ÇÊÇÈÉVÉXÉeÉÄÉ^ÉXÉNéûÇ…ÉpÅ[ÉWÇ≥ÇÍÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅBǬNjÇËÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ WaitNextEvent Ç‹ÇΩÇÕ SystemTask ÇåƒÇ—èoǵǃéûä‘ÇåvéZÇ∑ÇÈÇΩÇ—Ç…ÅAVRAM GWorld ÇÃì‡óeÇ™é∏ÇÌÇÍǃǵNjǧâ¬î\ê´Ç™Ç†ÇÈÇΔǢǧDZÇΔÇ≈Ç∑ÅBDZÇÃñ‚ëËÇÕÅAí èÌÅAï\é¶âëúìxÇ‚êFêîÇÃïœçXÇ…ä÷òAǵǃǢǃÅAǪÇÍÇŸÇ«ïpî…Ç…î≠ê∂Ç∑ÇÈÇÌÇØÇ≈ÇÕdžÇËÇ‹ÇπÇÒÇ™ÅAñúàÍÇÃèÍçáÇ…îıǶǃÉRÅ[ÉhÇèëÇ≠ïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃÇÊǧǻÉpÅ[ÉWÇÕÅAGWorld Ç™ÉçÉbÉNÇ≥ÇÍǃǢÇÈǩǫǧǩDžÇÊǡǃÅAî≠ê∂ǵÇΩÇËî≠ê∂ǵǻǩǡÇΩÇËÇ∑ÇÈDZÇΔLJdžÇËÇ‹Ç∑ÅB

LockPixels Ç©ÇÁï‘Ç≥ÇÍÇÈ FALSEÅAGetPixBaseAddr Ç©ÇÁï‘Ç≥ÇÍÇÈ NULLÅAÇ‹ÇΩÇÕ PixMap Çà baseAddr ÉtÉBÅ[ÉãÉhÇ…ä‹Ç‹ÇÍÇÈ NULL ÇÕÇ¢Ç∏ÇÍLJÅAÉsÉNÉZÉãÉCÉÅÅ[ÉWÇ™ÉpÅ[ÉWÇ≥ÇÍÇΩDZÇΔÇé¶ÇµÇƒÇ¢Ç‹Ç∑ÅBÉsÉNÉZÉãÉCÉÅÅ[ÉWÇçƒäÑÇËìñǃÇ∑ÇÈÇ…ÇÕÅAUpdateGWorld Ç‹ÇΩÇÕ Dispose ÇåƒÇ—èoǵǃÅADisposeGWorld Ç©ÇÁìæÇÁÇÍÇΩåªç›Çà GWorld ÇèàóùǵÅANewGWorld Ç…ÇÊǡǃ GWorld Ççƒç\ízǵNjÇ∑ÅBÇ¢Ç∏ÇÍÇ©ÇÃï˚ñ@Ç≈ÉsÉNÉZÉãÉCÉÅÅ[ÉWÇçƒç\ízÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

ÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇ≈ÉJÉXÉ^ÉÄÉJÉâÅ[ÉeÅ[ÉuÉãÇégópÇ∑ÇÈÇ…ÇÕÅAä÷òAÇ√ÇØÇÁÇÍÇΩÉIÉtÉXÉNÉäÅ[Éì GDevice ÉåÉRÅ[ÉhÇçÏê¨Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÍÇÕÅAColor QuickDraw ǙǪÇÃîΩì]ÉeÅ[ÉuÉãÇïKóvÇΔÇ∑ÇÈÇΩÇflÇ≈Ç∑ÅB

åªç›ÇÃÇΔDZÇÎÅANewGWorld Ç≈ÇÕÅAéwíËÇ≥ÇÍÇΩÉpÉâÉÅÅ[É^ÇÃëgÇ›çáÇÌÇπÇ…ëŒÇ∑ÇÈìOíÍìIÇ»ÉGÉâÅ[É`ÉFÉbÉNÇçsǡǃǢNjÇπÇÒÅBNewGWorld ÇÕDZÇÍÇÁÇÃÉpÉâÉÅÅ[É^Ç™à”ñ°ÇéùǬLJÇÃÇΔëzíËǵǃǢNjÇ∑ÅBì¡Ç…ÅAêVǵǢÉtÉâÉOÉpÉâÉÅÅ[É^ÇégÇ¡ÇΩçÏãΔÇçsǧÇΔÇ´Ç…ÅADZÇÃÇÊǧǻñ≥èåèÇÃëOíÒÇ™ìKópÇ≥ÇÍÇ‹Ç∑ÅBÇΩÇΔǶnjÅAflags Ç… keepLocalÅAuseDistantHdwrMemÅAÇ®ÇÊÇ— useLocalHdwrMem ÇìnǵÅAaGDevice Ç… NULL ÇìnǵǃLJì¡Ç…ïsìsçáÇÕdžÇËÇ‹ÇπÇÒÇ™ÅADZÇÃÉpÉâÉÅÅ[É^ÇÃëgÇ›çáÇÌÇπÇ…ÇÕNjǡÇΩÇ≠à”ñ°Ç™Ç»Ç≠ÅADZÇÃÇΔÇ´ÇÃä÷êîÇÃìÆçÏLJíËã`Ç≥ÇÍǃǢNjÇπÇÒÅBNewGWorld Ç…éwíËǵÇΩÉtÉâÉOǂǪÇÃëºÇÃÉpÉâÉÅÅ[É^ÇÃëgÇ›çáÇÌÇπÇ™é¿ç€Ç…ã¶í≤ǵǃìÆçÏǵǃǢÇÈDZÇΔÇämîFÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÇ‹ÇΩÅAOS Ç…ÇÊÇÈDZÇÃéÌÇÃÉGÉâÅ[ÇÃÉ`ÉFÉbÉNÇä˙ë“ǵǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅB

NewGWorld ä÷êîÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÉqÅ[Évì‡ÇÃÉÅÉÇÉäÉuÉçÉbÉNÇà⁄ìÆÇµÇΩÇËÉpÅ[ÉWǵÇΩÇËÇ∑ÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™äÑÇËçûÇ›éûDžDZÇÃä÷êîÇåƒÇ—èoÇ≥ǻǢÇÊǧDžǵǃÇ≠ÇæÇ≥Ç¢ÅB


ÉäÉUÉãÉgÉRÅ[Éh

noErr

0

ê≥èÌèIóπ

paramErr

-50

ïsê≥Ç»ÉpÉâÉÅÅ[É^

memFullErr

-108

ÉÅÉÇÉäïsë´Ç…ÇÊÇÈÉGÉâÅ[

cDepthErr

-157

ñ≥å¯Ç»êFêî


ÅwInside Macintosh: Imaging With QuickDrawÅxLJéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

ÅwInside Macintosh: Imaging With QuickDrawÅxÇà 6-5 ÉyÅ[ÉWÇ…ãLç⁄Ç≥ÇÍǃǢÇÈ Listing 6-1 ÇΔÅA6-10 ÉyÅ[ÉWÇ…ãLç⁄Ç≥ÇÍǃǢÇÈ Listing 6-2 Ç…ÇÕÅANewGWorld ÇégǡǃÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇçÏê¨Ç∑ÇÈï˚ñ@Ç™ãÔëÃìIÇ…é¶Ç≥ÇÍǃǢNjÇ∑ÅB

ÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÉèÅ[ÉãÉhÇ…ëŒÇ∑ÇÈêFêîÅAã´äEãÈå`ÅAÇ‹ÇΩÇÕÉJÉâÅ[ÉeÅ[ÉuÉãÇïœçXÇ∑ÇÈïKóvǙdžÇÈèÍçáÇÕÅAÅwInside MacintoshÅxÇà 6-23 ÉyÅ[ÉWÇ…ãLç⁄Ç≥ÇÍǃǢÇÈ UpdateGWorld ä÷êîÇégópǵNjÇ∑ÅB

ÉyÅ[ÉWÇÃêÊì™Ç…ñflÇÈ

êVǵǢ NewGWorld () ÇÃégÇ¢ï˚

êVǵǢ NewGWorld ÇÃégÇ¢ï˚ÇÕäÓñ{ìIDžDZÇÍÇ‹Ç≈ÇΔìØólÇ≈Ç∑ÅBêVǵÇ≠í«â¡Ç≥ÇÍÇΩ 2 ǬÇÃÉtÉâÉOÇ≈džÇÈ useDistantHdwrMem Ç®ÇÊÇ— useLocalHdwrMem Ç…ÇÊÇËÅAÉÜÅ[ÉUÇÕÉIÉtÉXÉNÉäÅ[ÉìÉsÉNÉZÉãÉCÉÅÅ[ÉWÇ™äÑÇËìñǃÇÁÇÍÇÈóÃàÊÇéwíËÇ≈Ç´ÇÈÇÊǧDžǻÇËNjǵÇΩÅBuseDistantHdwrMem Ç‹ÇΩÇÕ useLocalHdwrMem ÇíPìΔÇ≈égópÇ∑ÇÈÇΔÅANewGWorld ÇÕÅAaGDevice Ç≈éwíËÇ≥ÇÍǃǢÇÈÉfÉoÉCÉXè„Çà VRAM Ç‹ÇΩÇÕ AGP ÉÅÉÇÉäì‡ÇÃǛDžÉCÉÅÅ[ÉWÇäÑÇËìñǃÇÊǧÇΔǵNjÇ∑ÅBDZÇÃäÑÇËìñǃDžé∏îsÇ∑ÇÈÇΔÅANewGWorld ÇÕàŸèÌèIóπǵÅAmemFullErr ÉGÉâÅ[Çï‘ǵNjÇ∑ÅBuseDistantHdwrMem ÇΔ useLocalHdwrMem ÇÃóºï˚ÇéwíËÇ∑ÇÈÇΔÅANewGWorld ÇÕÇ‹Ç∏ VRAM ì‡Ç≈äÑÇËìñǃÇééÇ›ÅADZÇÃå„ÅAaGDevice Ç≈éwíËÇ≥ÇÍǃǢÇÈÉfÉoÉCÉXÇà AGP ÉÅÉÇÉäì‡Ç≈äÑÇËìñǃÇééǛNjÇ∑ÅBóºï˚ÇÃäÑÇËìñǃDžé∏îsÇ∑ÇÈÇΔÅANewGWorld ÇÕàŸèÌèIóπǵÅAmemFullErr ÉGÉâÅ[Çï‘ǵNjÇ∑ÅBAGP ÉÅÉÇÉäÇ‹ÇΩÇÕ VRAM ì‡Ç≈äÑÇËìñǃÇçsǧÇΔÇ´Ç…ÅAaGDevice Ç…ÇÕê‚ëŒÇ… NULL ÇéwíËǵǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBNULL ÇéwíËÇ∑ÇÈÇΔÅAäÑÇËìñǃDžégópÇ∑ÇÈÉfÉoÉCÉXÇ™ïsíËDžǻǡǃǵNjǢNjÇ∑ (DZÇÍÇÕÉfÉxÉçÉbÉpÇ…ÇÊǡǃà”ê}Ç≥ÇÍÇΩDZÇΔÇ≈ǻǢÇÃÇÕñæÇÁÇ©Ç≈Ç∑)ÅB

useDistantHdwrMem ÇÕÅAàÍìx (Ç‹ÇΩÇÕêîâÒ) ê›íËǵÅAǪÇÃå„Ç≈åJÇËï‘ǵégópÇ∑ÇÈÉsÉNÉZÉãÉCÉÅÅ[ÉWÇäÑÇËìñǃÇÈÇΩÇflÇ…ñóßÇøÇ‹Ç∑ÅBÉVÉXÉeÉÄÉÅÉÇÉäÇ©ÇÁ VRAM ÉsÉNÉZÉãÉCÉÅÅ[ÉWÇ÷ÇÃèëÇ´çûǛDžÇÕî‰ärìIéûä‘ǙǩǩÇËÇ‹Ç∑Ç™ÅAVRAM Ç©ÇÁ VRAMÅAÇ‹ÇΩÇÕ VRAM Ç©ÇÁÉXÉNÉäÅ[ÉìÇ÷ÇÃÉnÅ[ÉhÉEÉFÉAÉRÉsÅ[ÇÕîÒèÌÇ…çÇë¨Ç…é¿çsÇ≥ÇÍÇ‹Ç∑ÅBåªç›ÇÃÇΔDZÇÎÅAÉRÉsÅ[ÉIÉyÉåÅ[ÉVÉáÉìÇ™ÉnÅ[ÉhÉEÉFÉAÉAÉNÉZÉâÉåÅ[ÉVÉáÉìÇégópÇ∑ÇÈǩǫǧǩÇîªífÇ∑ÇÈÉÅÉJÉjÉYÉÄÇÕópà”Ç≥ÇÍǃǢǻǢÇΩÇflÅAVRAM ì‡Ç…äÑÇËìñǃÇÈÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÕÇ∑Ç◊ǃìØÇ∂êFêîÇégópǵÅAÉXÉNÉäÅ[ÉìÇΔìØÇ∂ÉJÉâÅ[ÉeÅ[ÉuÉãÇã§óLÇ∑ÇÈDZÇΔÇ™ñ]NjǵǢÇΔǢǶNjÇ∑ÅBÇ‹ÇΩÅAÉ}ÉXÉNÇ‚ÉTÉCÉYïœçXÇégópǵǻǢíPèÉÇ»ÉRÉsÅ[ÉIÉyÉåÅ[ÉVÉáÉìÇégópǵÅAÇ≈Ç´ÇÈǩǨÇËÉRÉsÅ[ÇÃÉpÉtÉHÅ[É}ÉìÉXÇå¸è„Ç≈Ç´ÇÈÇÊǧDžîzó∂ǵǃÇ≠ÇæÇ≥Ç¢ÅB

useLocalHdwrMem ÇÕÅAAGP ÉÅÉÇÉäì‡Ç≈ÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃäÑÇËìñǃÇééǛNjÇ∑ÅBÉVÉXÉeÉÄÇ… AGP ÉOÉâÉtÉBÉbÉNÉXÉVÉXÉeÉÄÇ™ìãç⁄Ç≥ÇÍǃǢǻǩǡÇΩÇËÅANewGWorld Ç™ÉsÉNÉZÉãÉCÉÅÅ[ÉWÇäÑÇËìñǃÇÈDZÇΔÇ™Ç≈ǴǻǢÇΔÅAäÑÇËìñǃÇÕàŸèÌèIóπǵÅAmemFullErr ÉGÉâÅ[Ç™ï‘Ç≥ÇÍÇ‹Ç∑ÅBAGP äÑÇËìñǃÇÕÉVÉXÉeÉÄÉÅÉÇÉäì‡Ç≈é¿çsÇ≥ÇÍÇÈÇΩÇflÅAVRAM ì‡Ç…äÑÇËìñǃÇÈÉsÉNÉZÉãÉCÉÅÅ[ÉWÇ…ä÷òAÇ∑ÇÈÇÊǧǻñ‚ëËÇÃâeãøÇéÛÇØÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅBǵǩǵÅAAGP ÉÅÉÇÉäÇ…ÇÕÅAÉLÉÉÉbÉVÉÖÇ…äiî[Ç≈ǴǻǢÅAëºÇÃÉVÉXÉeÉÄÉÅÉÇÉäÇΔÇÃä‘Ç≈ÉRÉsÅ[ÇçsǧÇΔí èÌÇÃÉVÉXÉeÉÄÉÅÉÇÉäÇÊÇËLJèàóùÇ™é·ä±íxÇ≠Ç»ÇÈǻǫÅAÇ¢Ç≠ǬǩÇÃêßå¿Ç™Ç†ÇËÇ‹Ç∑ÅBǪÇÍÇŸÇ«ñ‚ëËÇ…ÇÕÇ»ÇËÇ‹ÇπÇÒÇ™ÅAÉpÉtÉHÅ[É}ÉìÉXÇ™é·ä±í·â∫Ç∑ÇÈÇÃÇÕéñé¿Ç≈Ç∑ÅB

äÑÇËìñǃǙçsÇÌÇÍÇÈóÃàÊÇ‚ÅAïWèÄìIÇ»ÉVÉXÉeÉÄÉÅÉÇÉäà»äOÇÃóÃàÊÇ≈äÑÇËìñǃÇçsǧDZÇΔÇ…î∫ǧàÍî ìIÇ»íçà”éñçÄ (ëOÇÃíióéÇ≈ê‡ñæÇµÇΩÇÊǧǻ) Çê≥ǵÇ≠óùâÇ∑ÇÈDZÇΔÇÕîÒèÌÇ…èdóvÇ≈Ç∑ÅBuseDistantHdwrMem Ç‹ÇΩÇÕ useLocalHdwrMem ÉtÉâÉOÇ…ÇÊÇÈÉIÉtÉXÉNÉäÅ[Éì GWorld ÇégópÇ∑ÇÈÇΔÇ´Ç…ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉpÉtÉHÅ[É}ÉìÉXÇå¸è„Ç≥ÇπÇÈÉ|ÉCÉìÉgÇÕÅAÇ«ÇÃÉsÉNÉZÉãÉCÉÅÅ[ÉWÇ™ïpî…Ç…égópÇ≥ÇÍǃǢǃÅAÇ«ÇÃÉsÉNÉZÉãÉCÉÅÅ[ÉWÇ™ÉnÅ[ÉhÉEÉFÉAÉAÉNÉZÉâÉåÅ[ÉVÉáÉìÇ…ÇÊÇÈÉRÉsÅ[Ç…à⁄çsÇ≈Ç´ÇÈÇ©ÇÇ´ÇøÇÒÇΔîFéØÇ∑ÇÈDZÇΔÇ≈Ç∑ÅBîÒèÌÇ…ïpî…Ç…égópÇ≥ÇÍÅAÇŸÇΔÇÒÇ«ïœçXÇ≥ÇÍǻǢÉCÉÅÅ[ÉWÇÕÅAVRAM ì‡Ç…íuǢǃÉRÉsÅ[ÇÃÉpÉtÉHÅ[É}ÉìÉXÇç≈ìKâªÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBàÍî ìIÇ»ópìrÇ…ÇÕ AGP ÉÅÉÇÉäÇégópÇ≈Ç´Ç‹Ç∑ÅBAGP ÉÅÉÇÉäÇÃóeó ÇÕêßå¿Ç≥ÇÍǃǢǃÅAǵǩLJ OpenGL ǻǫÇÃëºÇÃÉOÉâÉtÉBÉbÉNÉTÅ[ÉrÉXLJDZÇÍÇégópÇ∑ÇÈÇΩÇflÅAÇÊÇËïpî…Ç…égópÇ≥ÇÍÇÈÉCÉÅÅ[ÉWÇÇ‹Ç∏äÑÇËìñǃÇÈÇÊǧDžíçà”Çï•ǢNjÇ∑ÅBÇ‹ÇΩÅAAGP ÉÅÉÇÉäÇÕâºëzÉÅÉÇÉäÉVÉXÉeÉÄÇ…ÇÊǡǃÉfÉBÉXÉNÇ…ÉXÉèÉbÉvÇ≥ÇÍÇ∏ÅAégópâ¬î\Ç» AGP ÉÅÉÇÉäóeó ÇÕÉVÉXÉeÉÄÇ…ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÈï®óùÉÅÉÇÉäÇÃóeó Ç…ÇÊǡǃïœÇÌÇÈì_DžLJíçà”Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

ÉRÉsÅ[Ç…ÉnÅ[ÉhÉEÉFÉAÉAÉNÉZÉâÉåÅ[ÉVÉáÉìÇ™égópÇ≥ÇÍǻǢèÍçáÅAAGP ÉÅÉÇÉäÇ©ÇÁÉXÉNÉäÅ[ÉìÇ÷ÇÃÉRÉsÅ[ÇÃÉpÉtÉHÅ[É}ÉìÉXÇÕÅAç≈ëÂÇ≈ÉVÉXÉeÉÄÉÅÉÇÉäÇΔìØìôÇ…Ç»ÇÈDZÇΔÇ™ä˙ë“Ç≈Ç´Ç‹Ç∑ÅBìØólÇ…ÉAÉNÉZÉâÉåÅ[ÉVÉáÉìÇ™égópÇ≥ÇÍǻǢÉPÅ[ÉXÇ≈ÅAVRAM Ç©ÇÁÉXÉNÉäÅ[ÉìÇ÷ÇÃÉRÉsÅ[ÇÃÉpÉtÉHÅ[É}ÉìÉXÇÕÉVÉXÉeÉÄÉÅÉÇÉäÇΔî‰ärÇ∑ÇÈÇΔé·ä±íxÇ≠Ç»ÇËÇ‹Ç∑ÅBDZÇÃÇÊǧDžÉCÉÅÅ[ÉWÇíçà”ê[Ç≠äÑÇËìñǃÅAAGP ÉÅÉÇÉäÇΔ VRAM Çå´Ç≠égÇ¢ï™ÇØÇƒÇ≠ÇæÇ≥Ç¢ÅB

NewGWorld Ç™ÉAÉvÉäÉPÅ[ÉVÉáÉìÉqÅ[ÉvÇÃäOïî (ǬNjÇËÅAAGP ÉÅÉÇÉäãÛä‘Ç‹ÇΩÇÕ VRAM) Ç…ÉÅÉÇÉäÇäÑÇËìñǃÇÈÇΔÇ´ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇèIóπÇ∑ÇÈëOÇ… DisposeGWorld ÇégǡǃÅAǪÇÃÉÅÉÇÉäÇìKêÿÇ…èàóùÇ∑ÇÈDZÇΔÇ™îÒèÌÇ…èdóvÇ≈Ç∑ÅBDZÇÍÇ…é∏îsÇ∑ÇÈÇΔÅAÉÅÉÇÉäÉäÅ[ÉNÇ™î≠ê∂ǵÅAǪÇÍà»ç~ VRAM Ç‹ÇΩÇÕ AGP ÉÅÉÇÉäÇégópÇ≈Ç´Ç»Ç≠ǻǡǃǵNjǢNjÇ∑ÅBëΩÇ≠ÇÃèÍçáÅADZÇÃÇÊǧDžǵǃÉäÅ[ÉNǵÇΩÉÅÉÇÉäÇÕÉVÉXÉeÉÄÇçƒãNìÆÇµÇ»Ç¢Ç©Ç¨ÇËâÒïúÇ≥ÇÍÇ‹ÇπÇÒÅB

é¿ç€Ç…ÉCÉìÉvÉäÉÅÉìÉgÇ∑ÇÈÇΔÇ´ÇÕÅAÇ∑Ç≈Ç…èqÇ◊ÇΩ VRAM Ç…äÑÇËìñǃÇÈ GWorld ÇÃíçà”éñçÄÇämé¿Ç…éÁǡǃÇ≠ÇæÇ≥Ç¢ÅBGWorld ÇÃÉsÉNÉZÉãÉCÉÅÅ[ÉWÇ VRAM ì‡Ç≈ê≥ǵÇ≠à⁄ìÆÇ‹ÇΩÇÕÉpÅ[ÉWÇ∑ÇÈDZÇΔÇ™åàÇfléËÇ≈Ç∑ÅBDZÇÍÇ…ÇÊÇËÅAVRAM GWorld ÇégópǵÇÊǧÇΔÇ∑ÇÈÇΔÇ´Ç…âÊñ Ç…ÉSÉ~Ç™ï\é¶Ç≥ÇÍÇΩÇËÅAñ≥å¯Ç»ÉÅÉÇÉäÇ…ÉAÉNÉZÉXÇ∑ÇÈDZÇΔÇ™ämé¿Ç…Ç»Ç≠Ç»ÇËÇ‹Ç∑ÅB

ÉyÅ[ÉWÇÃêÊì™Ç…ñflÇÈ

ÉCÉìÉvÉäÉÅÉìÉgÇÃÉTÉìÉvÉã

NewGWorld ÇÃÉCÉìÉvÉäÉÅÉìÉgÇÕé¿ç€Ç…ÇÕîÒèÌÇ…ä»íPÇ≈Ç∑ÅBà»â∫Ç…ÅAé¿ç€ÇÃçÏãΔÇ≈ñÇ…óßǬíPèÉÇ»ÉTÉìÉvÉãÉRÅ[ÉhÇé¶ÇµÇ‹Ç∑ÅBÇ‹Ç∏ÅAêVǵǢÉtÉâÉOÇ™égópÇ≈Ç´ÇÈǩǫǧǩÇÉeÉXÉgǵNjÇ∑ÅBDZÇÃÇΔÇ´ïKóvÇ…Ç»ÇÈÇÃÇÕÅAÉVÉXÉeÉÄÇÃÉoÅ[ÉWÉáÉìÇämîFÇ∑ÇÈDZÇΔÇæÇØÇ≈Ç∑ (NewGWorld ÇÃêVÉoÅ[ÉWÉáÉìÇ…ì¡éÍÇ»ÉZÉåÉNÉ^ÇÕä‹Ç‹ÇÍǃǢǻǢÇÃÇ≈)ÅBégópíÜÇà Mac OS Ç™ 8.6 ÇÊÇËëÂǴǢLJÇÃÇ≈džÇÍÇŒÅAuseDistantHdwrMem Ç®ÇÊÇ— useLocalHdwrMem Ç™égópâ¬î\Ç≈džÇÈÇΔå©Ç»ÇπÇ‹Ç∑ÅB


Boolean gNewNewGWorld = false;
long versionSystem;
// DZÇÍÇÕÅA8.6 à»ç~Çà Mac OS Ç≈ìÆçÏÇ∑ÇÈ
Gestalt ('sysv', &versionSystem);
 if (0x00000860 < (versionSystem & 0x00000FFFF))
      gNewNewGWorld = true; // ÉVÉXÉeÉÄÇÕÉoÅ[ÉWÉáÉì 8.6 à»ç~Ç≈džÇÈ

éüÇ…ÅAGWorld ÇÃäÑÇËìñǃÇΔçƒäÑÇËìñǃDžïKóvÇΔÇ»ÇÈä÷êîÇÉJÉvÉZÉãâªÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBóºï˚ÇÃèàóùÇ…ÇÕìØÇ∂ÉçÉWÉbÉNÇégópǵNjÇ∑ÅBǬNjÇËÅAÇ‹Ç∏ GWorldPtr ÇÉ`ÉFÉbÉNǵÅAÇ≥ÇÁÇ…ÉsÉNÉZÉãÉCÉÅÅ[ÉWÇà baseAddr ÇÉ`ÉFÉbÉNǵǃÅAç≈å„Ç…ÉEÉCÉìÉhÉEÇà GDevice Ç™Ç‹ÇæÉIÉtÉXÉNÉäÅ[ÉìÇà GDevice ÇΔìØÇ∂Ç≈džÇÈǩǫǧǩÇÉ`ÉFÉbÉNǵNjÇ∑ÅBGWorld ÇäÑÇËìñǃÇÈÇΔÇ´ÇÕÅAà íuì¸óÕÉpÉâÉÅÅ[É^ÇéwíËǵÅADZÇÃÉpÉâÉÅÅ[É^ÇégǡǃÅAäÑÇËìñǃÇçsǧÉÅÉÇÉäãÛä‘ (VRAMÅAAGP ÉÅÉÇÉäÅAÇ‹ÇΩÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÉqÅ[Év) ÇåàíËǵNjÇ∑ÅBäÑÇËìñǃǙê≥èÌÇ…èIóπǵǻǩǡÇΩèÍçáÇÕÅAéüÇÃÉ^ÉCÉvÇëŒè€Ç…èàóùÇåJÇËï‘ǵNjÇ∑ÅBÇ‡ÇøÇÎÇÒÅADZÇÃìÆçÏÇÕïKóvÇ…âûÇ∂ǃèCê≥Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBGWorld ÇÃäÑÇËìñǃNjÇΩÇÕçƒäÑÇËìñǃǙê≥èÌÇ…èIóπǵÇΩÇΔÇ´ÇÕ True Ç™ï‘Ç≥ÇÍÅAä˘ë∂Çà GWorld Ç™óLå¯Ç»ÇΔÇ´ÇÕ False Ç™ï‘Ç≥ÇÍÇ‹Ç∑ÅBà»â∫ÇÃÉTÉìÉvÉãÉRÅ[ÉhÇÕDZÇÃàÍòAÇÃèàóùÇé¶ÇµÇƒÇ¢Ç‹Ç∑ÅB


Boolean BuildOffscreen (GWorldPtr * ppGWorld, WindowPtr pWindow,
                        short * plocation)
{ 
     GDHandle hgdWindow = NULL;
     Boolean fMustRebuild = false;
         
if (NULL == *ppGWorld) // ìnÇ≥ÇÍÇΩ GWorld Ç™äÑÇËìñǃÇÁÇÍǃǢǻǢèÍçá
     fMustRebuild = true;
else
{
     PixMapHandle hPixmap = GetGWorldPixMap (*ppGWorld);
     // pixmap ÉnÉìÉhÉãÇ™ NULL Ç≈džÇÈÇ©ÅApixmap ÇÃÉxÅ[ÉXÉAÉhÉåÉXÇ™ NULL ÇÃèÍçá
     if ((NULL == hPixmap) || (!GetPixBaseAddr (hPixmap)))
         fMustRebuild = true;
     // GWorld Ç™ÉEÉCÉìÉhÉEÇΔìØÇ∂ÉfÉoÉCÉXè„DžǻǢèÍçá
         else if (GetGWorldDevice(*ppGWorld) != GetWindowDevice (pWindow))
         fMustRebuild = true;
}
         
if (fMustRebuild) // çƒç\ízÇ∑ÇÈïKóvǙdžÇÈ
{
     // ÉEÉCÉìÉhÉEÇÃêFêî
     short wPixDepth = (**((CGrafPtr)pWindow)->portPixMap).pixelSize; 
     GDHandle hgdWindow = GetWindowDevice (pWindow);// ÉEÉCÉìÉhÉEÇà GDevice
     if (NULL != *ppGWorld) // äÑÇËìñǃÇÁÇÍÇΩ GWorld ǙdžÇÈèÍçá
     {
         DisposeGWorld (*ppGWorld);// åªç›Çà GWorld ÇÉ_ÉìÉvÇ∑ÇÈ
         *ppGWorld = NULL;
     }
     switch (*plocation) // îzíuǵÇΩÇ¢èÍèä
     {
         case kInVRAM:
             if (noErr == NewGWorld (ppGWorld, wPixDepth, &pWindow->portRect,
                                     NULL, hgdWindow,
                                     noNewDevice | useDistantHdwrMem))
              break;
         // VRAM Ç≈é∏îsǵÇΩÇÁÅAǪÇÃÉVÉOÉiÉãÇëóÇËÅAAGP Ç…à⁄ÇÈ
         SysBeep (30);
         *plocation = kInAGP;
     case kInAGP:
         if (noErr == NewGWorld (ppGWorld, wPixDepth, &pWindow->portRect,
                                 NULL, hgdWindow,
                                 noNewDevice | useLocalHdwrMem))
              break;
         // AGP Ç≈é∏îsǵÇΩÇÁÅAǪÇÃÉVÉOÉiÉãÇëóÇËÅAÉVÉXÉeÉÄÉÅÉÇÉäÇ…à⁄ÇÈ
         SysBeep (30);
         *plocation = kInSystem;
     case kInSystem:
     default:
         if (noErr != NewGWorld (ppGWorld, wPixDepth,
                                 &pWindow->portRect, NULL, hgdWindow,
                                 keepLocal | noNewDevice))
         
          {
              // ÉVÉXÉeÉÄÇ≈LJé∏îsǵÇΩÇÁÅAGWorld ÇäÑÇËìñǃÇÈDZÇΔÇÕÇ≈ǴǻǢ
              // ìKêÿÇ»ÉçÉPÅ[ÉVÉáÉìǙǻǢDZÇΔÇé¶Ç∑ÉVÉOÉiÉãÇëóÇËÅAÉfÉoÉbÉKÇ…à⁄ÇÈ
              SysBeep (30);
              *plocation = kNoWhere;
              DebugStr ("\pUnable to allocate off screen image");
              return false; // âΩLJäÑÇËìñǃÇÁÇÍǻǩǡÇΩ
         }
         *plocation = kInSystem;
    } 
     return true; // GWorld Ççƒç\ízÇ∑ÇÈ
   }
   return false; // Ç∑Ç◊ǃ OK
}

DZÇÃëOÇÃä÷êîÇÕÅAëÂëΩêîÇÃÉEÉCÉìÉhÉEÇ™èÌíìÇ∑ÇÈ GDevice ÇåàíËÇ∑ÇÈ GetWindowDevice ÇåƒÇ—èoÇ∑ì_ÇèúÇØÇŒÅAïWèÄìIÇ» Macintosh Toolbox ä÷êîÇégópǵǃǢNjÇ∑ÅBǻǮÅAÉEÉCÉìÉhÉEÇ™ï°êîÇÃÉfÉoÉCÉXÇ…ÇÌÇΩÇÈÉPÅ[ÉXÇèàóùÇ∑ÇÈǩǫǧǩÇÕǪÇÍǺÇÍÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÉfÉxÉçÉbÉpÇÃîªífÇ…àœÇÀÇÁÇÍǃǢÇÈÇΔǢǧDZÇΔÇ…íçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅBéüÇ…ÅAGetWindowDevice ÇÃÉRÅ[ÉhÇé¶ÇµÇ‹Ç∑ÅB

GDHandle GetWindowDevice (WindowPtr pWindow)
{
     Rect rectWind, rectSect;
     short wFrameHeight, wTitleHeight;
     long greatestArea, sectArea;
     GDHandle hgdNthDevice, hgdZoomOnThisDevice;
         
     rectWind = pWindow->portRect;
     LocalToGlobal ((Point*)& rectWind.top); // ÉOÉçÅ[ÉoÉãç¿ïWÇ…ïœä∑Ç∑ÇÈ
     LocalToGlobal ((Point*)& rectWind.bottom);
     // ÉEÉCÉìÉhÉEÇÃÉ^ÉCÉgÉãÉoÅ[ÇÃçÇÇ≥ÇåvéZÇ∑ÇÈ
     wFrameHeight = rectWind.left - 1 ?
                   (**(((WindowPeek)pWindow)->strucRgn)).rgnBBox.left;
     wTitleHeight = rectWind.top - 1 ?
                   (**(((WindowPeek)pWindow)->strucRgn)).rgnBBox.top;
     rectWind.top = rectWind.top - wTitleHeight;
     hgdNthDevice = GetDeviceList ();
     greatestArea = 0; // 0 Ç…èâä˙âªÇ∑ÇÈ
     // GDevice ÉäÉXÉgÇ…ä‹Ç‹ÇÍÇÈÇ∑Ç◊ǃÇà gdRects Ç…ëŒÇ∑ÇÈÉEÉCÉìÉhÉEÇÉ`ÉFÉbÉNǵÅA
     //  Ç«Çà gdRect Ç…ÉEÉCÉìÉhÉEÇÃç≈ëÂóÃàÊÇ™ä‹Ç‹ÇÍǃǢÇÈÇ©ÇãLâØÇ∑ÇÈ
     while (hgdNthDevice)
     {
         if (TestDeviceAttribute (hgdNthDevice, screenDevice))
              if (TestDeviceAttribute (hgdNthDevice, screenActive))
              {
                   // SectRect ÉãÅ[É`ÉìÇÕÉEÉCÉìÉhÉEãÈå`ÇΔ
                   //  DZÇà GDevice ãÈå`ÇΔÇÃåç∑ÇåvéZǵÅA
                   //  ãÈå`ìØémÇ™åÇÌÇÈèÍçáÇÕ TRUE Çï‘ǵÅA
                   //  ǪǧÇ≈ǻǢèÍçáÇÕ FALSE Çï‘Ç∑
                   SectRect(&rectWind, &(**hgdNthDevice).gdRect, &rectSect);
                   // Ç‹Ç∏ÅAÇ«ÇÃÉXÉNÉäÅ[ÉìÇ™ç≈ëÂÇÃÉEÉCÉìÉhÉEóÃàÊÇï€éùǵǃǢÇÈÇ©Ç
                   //  îªífǵÅAåªç›ÇÃÉfÉoÉCÉXè„Ç≈ÇÃãÈå`ÇÃóÃàÊÇåvéZÇ∑ÇÈ
                   sectArea = (long)(rectSect.right - rectSect.left) *
  (rectSect.bottom - rectSect.top);
                   if ( sectArea > greatestArea )
                   {
                        greatestArea = sectArea;// ǢNjNjÇ≈ÇÃç≈ëÂÇÃóÃàÊÇê›íËÇ∑ÇÈ
                        hgdZoomOnThisDevice = hgdNthDevice;// ÉYÅ[ÉÄÉfÉoÉCÉXÇê›íËÇ∑ÇÈ
                   }
                   hgdNthDevice = GetNextDevice(hgdNthDevice);
              }
         } // while ÉãÅ[Év
     return hgdZoomOnThisDevice;
}
         

ÉoÉbÉtÉ@ÇÃäÑÇËìñǃǙäÆóπǵÇΩå„ÇÕÅAǪÇÍÇ…ÉfÅ[É^ÇèëÇ´çûÇ›ÅAǪÇÍÇÉEÉCÉìÉhÉEÇ…ÉuÉäÉbÉgÇ∑ÇÈÇæÇØÇ≈Ç∑ÅBDZÇÃèàóùÇçsǧÉvÉçÉZÉXÇÕDZÇÍÇ‹Ç≈ìØólÇ≈Ç∑ÅBéüÇ…ÅADZÇÃèàóùÇÃãÔëÃó·Çé¶ÇµÇ‹Ç∑ÅBǻǮÅAFillOffscreen ÇÕìnÇ≥ÇÍÇΩ GWorldPtr Ç™óLå¯Ç≈džÇÈDZÇΔÇëOíÒDžǵǃǢNjÇ∑Ç™ÅABlitToWindow ÇÕÇÊÇËàÍî ìIÇ»ópìrÇ…égópÇ≥ÇÍÅAGWorld ÇëŒè€ÇΔÇ∑ÇÈÉ`ÉFÉbÉNÇé¿çsǵNjÇ∑ÅB


// ÉIÉtÉXÉNÉäÅ[ÉìÉoÉbÉtÉ@ÇÉâÉìÉ_ÉÄÇ»ñæêFÇ≈ìhÇËǬǑÇ∑
         
void FillOffscreen (GWorldPtr pGWorld)
{
     GDHandle hGDSave;
     CGrafPtr pCGrafSave;
     Rect rectSource = (pGWorld->portRect);
     RGBColor rgbColor;
         
     rgbColor.red   = (Random () + 32767) / 2 + 32767;
     rgbColor.green = (Random () + 32767) / 2 + 32767;
     rgbColor.blue  = (Random () + 32767) / 2 + 32767;
         
     GetGWorld (&pCGrafSave, &hGDSave);
     SetGWorld (pGWorld, NULL);
     if (LockPixels (GetGWorldPixMap (pGWorld)))
     {
         // ÉoÉbÉNÉOÉâÉìÉhÇï`âÊÇ∑ÇÈ
         EraseRect (&rectSource);
         RGBForeColor (&rgbColor);
         PaintRect (&rectSource);
         UnlockPixels (GetGWorldPixMap (pGWorld));
     }
     SetGWorld (pCGrafSave, hGDSave);
}
         
// ÉIÉtÉXÉNÉäÅ[ÉìÇÉ`ÉFÉbÉNǵÅAǪÇÍÇëOñ Ç…ÉuÉäÉbÉgÇ∑ÇÈ
         
void BlitToWindow (GWorldPtr pGWorld, WindowPtr pWindow, short * pLocation)
{
    Rect rectDest = ((GrafPtr)pWindow)->portRect;
     Rect rectSource = ((GrafPtr)pWindow)->portRect;
     GrafPtr pCGrafSave;
         
     // ÉIÉtÉXÉNÉäÅ[ÉìÇ™óLå¯Ç≈džÇÈDZÇΔÇämîFǵÅAïKóvÇ»èÍçáÇÕçƒç\ízÇ∑ÇÈ
     if (BuildOffscreen (&pGWorld, pWindow, pLocation))
     FillOffscreen (pGWorld);
         
     // ÉuÉäÉbÉg
     GetPort (&pCGrafSave);
     SetPort ((GrafPtr) pWindow);
     if (LockPixels (GetGWorldPixMap (pGWorld)))
     {
         CopyBits (&((GrafPtr)pGWorld)->portBits,
                   &pWindow->portBits, &rectSource, &rectDest, srcCopy, NULL);
         UnlockPixels (GetGWorldPixMap (pGWorld));
     }
     SetPort (pCGrafSave);
}

ç≈å„Ç…ÅANewGWorld Ç…ÇÊǡǃäÑÇËìñǃÇÁÇÍÇΩÉÅÉÇÉäÇ™ìKêÿÇ…èàóùÇ≥ÇÍǃǢÇÈDZÇΔÇämîFÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBéüÇÃÉRÅ[ÉhÇÕDZÇÃèàóùÇãÔëÃìIÇ…é¶ÇµÇƒÇ¢Ç‹Ç∑ÅB

// GWorld Ç™ÉAÉvÉäÉPÅ[ÉVÉáÉìÉqÅ[Évì‡Ç…ë∂ç›ÇµÇ»Ç¢â¬î\ê´Ç™Ç†ÇÈÇΩÇflÅADZÇÃèàóùÇÕîÒèÌÇ…èdóv
if (pGWorld)
     DisposeGWorld (pGWorld);
pGWorld = NULL;

ÉyÅ[ÉWÇÃêÊì™Ç…ñflÇÈ

óvñÒ

êVǵǢ NewGWorld ÇégópÇ∑ÇÈÇΔÅAÉpÉtÉHÅ[É}ÉìÉXÉIÉäÉGÉìÉeÉBÉbÉhÇ»ÉAÉvÉäÉPÅ[ÉVÉáÉìÇçÏê¨Ç∑ÇÈÇΔÇ´Ç…égópÇ≈Ç´ÇÈëIëéàÇÃêîÇ™ëÂïùÇ…ëùâ¡ÇµÇ‹Ç∑ÅBÇΩÇΔǶnjÅAÉsÉNÉZÉãÉCÉÅÅ[ÉWÇ VRAM Ç‹ÇΩÇÕ AGP ÉÅÉÇÉäãÛä‘Ç…äÑÇËìñǃÇÈDZÇΔÇ≈ÅAà»ëOÇΔÇÕî‰Ç◊LJÇÃÇ…Ç»ÇÁǻǢÉåÉxÉãÇÃÉOÉâÉtÉBÉbÉNÉXÉpÉtÉHÅ[É}ÉìÉXÇíBê¨Ç≈Ç´Ç‹Ç∑ÅBÇΩÇæÇµÅADZÇÍÇÁÇÃêVã@î\ÇégópÇ∑ÇÈDZÇΔÇ≈ÉAÉvÉäÉPÅ[ÉVÉáÉìÉfÉxÉçÉbÉpÇ…ÇÕÇ¢Ç≠ǬǩÇÃèåèÇ™â€Ç≥ÇÍÇÈDZÇΔÇ…Ç»ÇËÅAÉRÅ[ÉhÇ™Ç∑Ç◊ǃÇÃèåèâ∫Ç≈ìKêÿÇ…ã@î\Ç∑ÇÈDZÇΔÇämîFÇµÇ»ÇØÇÍnjǻÇÁÇ»Ç≠Ç»ÇËÇ‹Ç∑ÅBà»â∫Ç…ÅAêVǵǢ NewGWorld ÇégópÇ∑ÇÈÇΔÇ´Ç…åüì¢Ç∑Ç◊Ç´É`ÉFÉbÉNÉäÉXÉgÇé¶ÇµÇ‹Ç∑ÅB

  • ÉVÉXÉeÉÄÇÃÉoÅ[ÉWÉáÉìÇÉ`ÉFÉbÉNǵÅAuseDistantHdwrMem Ç®ÇÊÇ— useLocalHdwrMem ÉtÉâÉOÇ™égópâ¬î\Ç≈džÇÈDZÇΔÇämîFÇ∑ÇÈÅB
  • seDistantHdwrMem Ç‹ÇΩÇÕ useLocalHdwrMem ÇégópÇ∑ÇÈÇΔÇ´ÇÕÅAGDevice ÇéwíËÇ∑ÇÈÅB
  • ÉGÉâÅ[Ç…ëŒÇ∑ÇÈñflÇËílÇÉ`ÉFÉbÉNÇ∑ÇÈÅB
  • ÉsÉNÉZÉãÉCÉÅÅ[ÉWÇÃÉxÅ[ÉXÉAÉhÉåÉXÇéÊìæÇ∑ÇÈÇΔÇ´ÇÕÅANULL Ç≈džÇÈǩǫǧǩÇÉ`ÉFÉbÉNÇ∑ÇÈÅB
  • ÉpÅ[ÉWÇ≥ÇÍÇΩÉsÉNÉZÉãÉCÉÅÅ[ÉWÇèàóùÇ∑ÇÈÇΩÇflÇÃâÒïúÇÃédëgÇ›ÇÉCÉìÉvÉäÉÅÉìÉgÇ∑ÇÈÅB
  • ÉVÉXÉeÉÄÇ…éûä‘ÇìnÇ∑ä÷êîÇ‚ VRAM ÇÃäÑÇËìñǃÇΔäÑÇËìñǃâèúÇçsǧDZÇΔÇÃÇ≈Ç´ÇÈä÷êîÇÃä‘Ç≈ÉxÅ[ÉXÉAÉhÉåÉXÇÉLÉÉÉbÉVÉÖÇ…äiî[ǵǻǢÅB
  • GWorlds Ç™ìKêÿÇ…èàóùÇ≥ÇÍǃǢÇÈDZÇΔÇämîFǵÅAVRAM Ç‹ÇΩÇÕ AGP ÉÅÉÇÉäÇ≈ÉÅÉÇÉäÉäÅ[ÉNÇ™î≠ê∂Ç∑ÇÈÇÃÇñhÇÆÅB

useDistantHdwrMem Ç®ÇÊÇ— useLocalHdwrMem ÉtÉâÉOÇÕÅAÉfÉxÉçÉbÉpÇ…ÉIÉtÉXÉNÉäÅ[ÉìÉOÉâÉtÉBÉbÉNÉXÇèàóùÇ∑ÇÈÇΩÇflÇÃÇ≥NjǥNjǻÉIÉvÉVÉáÉìÇíÒãüǵNjÇ∑Ç™ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…â€Ç≥ÇÍÇÈí«â¡èåèÇè\ï™Ç…óùâǵÇΩè„Ç≈égópÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

éQçlï∂å£


ÉyÅ[ÉWÇÃêÊì™Ç…ñflÇÈ


çXêVì˙: 1999 îN 10 åé 5 ì˙